//:C16:TStackTest.cpp
// {T} TStackTest.cpp
#include "TStack.h"
#include "../require.h"
#include <fstream>
#include <iostream>
#include <string>
using namespace std;

class X
{
    public:
        virtual ~X(){ cout << "~X " << endl; }
};

int main(int argc, char *argv[])
{
    requireArgs(argc, 1);    // File name is argument
    ifstream in(argv[1]);
    assure(in, argv[1]);
    Stack<string> textlines;
    string line;
    // Read file and store lines in the Stack:
    while(getline(in, line)) 
    {
        textlines.push(new string(line));
    }
    // Pop some lines from the stack:
    string *s;
    for(int i = 0; i < 10; i++)
    {
        if((s = (string*)textlines.pop()) == 0)
        {
            break;
        }
        cout << *s << endl;
        delete s;
    }
    // The destructor deletes the other strings.
    // Show that correct destruction happens:
    Stack<X> xx;
    for(int j = 0; j < 10; j++)
    {
        xx.push(new X);
    }
}
